/*
 * 文件名：SmsSender.java
 * 版权：Copyright by www.huawei.com
 * 描述：
 * 修改人：Administrator
 * 修改时间：2019年12月18日
 * 跟踪单号：
 * 修改单号：
 * 修改内容：
 */

package top.infopub.mgc.core.sender.sms;


import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.dom4j.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import top.infopub.common.ErrorCodeEnum;
import top.infopub.httpclient.base.HttpBizRsp;
import top.infopub.httpclient.proxy.HttpClientProxy;
import top.infopub.mgc.core.domain.PartnerInfoDomain;
import top.infopub.mgc.core.service.PartnerInfoService;
import top.infopub.mgc.util.DES;
import top.infopub.mgc.util.EnviornConfig;
import top.infopub.mgc.util.SHA1;
import top.infopub.util.Dom4JUtil;
import top.infopub.vo.ResponseVo;

import com.google.common.collect.Maps;


/**
 * 云信留客供应商-短信发送工具类
 * @author Awoke
 * @version 2019年12月19日
 * @see SmsSenderYx
 * @since
 */
@Component
public class SmsSenderYx {

    private static final Logger log = LoggerFactory.getLogger(SmsSenderYx.class);

    @Resource
    private EnviornConfig env;

    @Autowired
    private PartnerInfoService partnerInfoService;

    /** partner-code **/
    private static final String PARTNER_CODE_SMS_YX = "MGC_PARTNER_SMS_YX";

    /** 短信后缀 **/
    private static final String MSG_SUFFIX = "【云嗅科技】";

    /**
     * 下发短信 <br/>
     * @param mobile   手机号  只支持单个手机号码
     * @param content   短信内容
     * @see
     */
    @SuppressWarnings("unchecked")
    public ResponseVo<String> sendMessage(String mobile, String content) {
        try {
            if (!env.isProduction()) {
                return ResponseVo.getSuccessResponse();
            }
            // 添加后缀 
            content = content + MSG_SUFFIX;
            PartnerInfoDomain partnerInfo = partnerInfoService.getPartnerCache(PARTNER_CODE_SMS_YX);
            PartnerInfoDomain.Sms smsInfo = partnerInfo.getSms();
            Map<String, String> maps = Maps.newHashMap();
            maps.put("userCode", partnerInfo.getSpartnerAccName());
            maps.put("submitInfo", encrypt(partnerInfo.getSpartnerAccPassword(), mobile, content));
            // reqPostFormUTF8
            HttpBizRsp rsp = HttpClientProxy.reqPostFormUTF8(smsInfo.getSendUrl(), maps);
            if (rsp.isOk()) {
                String result = rsp.getData();
                Element rootEle = Dom4JUtil.stringToDocument(result).getRootElement();// 根目录
                String rspCode = rootEle.getTextTrim();
                log.info("sendSms to:{} >>content:{}  rspCode:{}", new Object[] {mobile, content,
                    rspCode});
                String status = NumberUtils.toLong(rspCode) > 0 ? "success" : "failure";
                // 解析返回结果
                if (StringUtils.equals("success", status)) {
                    return ResponseVo.getSuccessResponse();
                }
                else {
                    // 下发网关失败，直接返回异常
                    return ErrorCodeEnum.ERROR_MGC_SENDSMS.getResponseVo(rspCode);
                }
            }
            else {
                return ErrorCodeEnum.ERROR_MGC_SENDSMS.getResponseVo(rsp.getData());
            }
        }
        catch (Exception e) {
            log.error("sendMessage error", e);
            return ErrorCodeEnum.ERROR_MGC_SENDSMS.getResponseVo(e.getClass().getName() + " "
                                                                 + e.getMessage());
        }
    }

    /**
     * 加密
     * @param mobile
     * @param content
     * @return 
     * @see
     */
    private String encrypt(String pwd, String mobile, String content) {
        // 加密：key和iv是密码SHA1大写前8位
        String key = StringUtils.left(SHA1.toSHA1(pwd).toUpperCase(), 8);
        // 加密内容：密码，手机号，短信内容，通道号
        StringBuilder att = new StringBuilder();
        att.append("userPass=").append(pwd);// 登录密码
        att.append("&DesNo=").append(mobile);// 手机号码
        att.append("&Msg=").append(content);// 短信内容
        att.append("&Channel=").append("0");// 通道号 ，默认0
        return DES.encrypt(att.toString(), key, key);
    }

    public static void main(String... args)
        throws Exception {
        //Map<String, Object> success = sendMessage("13645194459", "修改手机号验证码：3416。如非本人操作请忽略此信息。");
        //System.out.println(sendMessage("15951899194", "修改手机号验证码：7777。如非本人操作请忽略此信息。【云嗅科技】"));
        //System.out.println(sendMessage("15951899194", "找回密码验证码：9214。如非本人操作请忽略此信息。【云嗅科技】"));
        //System.out.println(sendMessage("15951899194", "注册验证码：5035。如非本人操作请忽略此信息。【云嗅科技】"));
        //System.out.println(sendMessage("15951899194", "云眼监管：280144，您正在进行重置登录密码操作，验证码10分钟内有效。【云嗅科技】"));
        //System.out.println(sendMessage("15951899194", "云眼监管：项目万瑞·天赋未来工程进度与计划表有内容变更，登录App可查看详情。【云嗅科技】"));
        //System.out.println(sendMessage("15951899194", "您正在通过手机找回密码，此次操作验证码：829791，10分钟内有效。【云嗅科技】"));
        //String status =  NumberUtils.toLong("2335767646954114468") > 0 ? "success" : "failure";
        //System.out.println( status);
    }

}
